package lib.common.use;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.ContentUris;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Base64;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.LinearLayout;

import com.app.Config;
 

/**
 * 裁剪的方式，android版本不能统一，不能使用系统的方式；  
 * 09-18 17:03:43.810: W/System.err(32593): java.io.FileNotFoundException: /system/media/Pre-loaded/Pictures/20140918170343.jpg: open failed: EROFS (Read-only file system)
 * @author Administrator
 *
 */
public class DialogPhotoActivity extends Activity {
	
	
	private DialogPhotoActivity activity = this;

	private LinearLayout layout_photo_album;
	private LinearLayout layout_take_pictuare;
	
	
	private final static int CODE_PHOTO_ALBUM = 1001;
	private final static int CODE_TAKE_PICTUARE = 1002;
	private final static int CODE_PHOTO_ALBUM_KITKAT = 1003;
	private final static int CODE_PHOTO_ALBUM_NEW = 1004;	
	
	private final static int CODE_PHOTO_NEW_CALE_PIC = 1005;
	
	
	private File file;
	private String path = "";  //
	
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.dialog_photo);
	
		
		init();
		initListener();
	}

	
	
	void init(){
		layout_photo_album = (LinearLayout) findViewById(R.id.layout_photo_album);
		layout_take_pictuare = (LinearLayout) findViewById(R.id.layout_take_pictuare);
		
	}
	
	void initListener(){
		
		layout_photo_album.setOnClickListener( new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				///*
				// 4.4以上图片选择不同，使用老方法将崩溃
				final boolean isKitKat  = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
				
				if( isKitKat == false ){
					
					/*
					Intent picture = new Intent(
							Intent.ACTION_PICK,
							android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
					startActivityForResult(picture,	CODE_PHOTO_ALBUM);
					*/

					// 调用系统相册
					Intent intentFromGallery = new Intent();
					intentFromGallery.setType("image/*"); // 设置文件类型
					intentFromGallery
							.setAction(Intent.ACTION_GET_CONTENT);
					startActivityForResult(intentFromGallery,
							CODE_PHOTO_ALBUM_NEW);
					
				}
				else{
				
					Intent intent=new Intent(Intent.ACTION_GET_CONTENT);//ACTION_OPEN_DOCUMENT
					intent.addCategory(Intent.CATEGORY_OPENABLE);
					intent.setType("image/jpeg");
					startActivityForResult(intent, CODE_PHOTO_ALBUM_KITKAT);  
				}
				//*/
			
				
				
			}
		});
		
		layout_take_pictuare.setOnClickListener( new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				
				
				file = takePhoto(activity, Config.PIC_TEMP_SAVE_PATH);
				
			}
		});
		
		
		
	}

	
	   /**
		 * 调用系统相机
		 */
		public static File takePhoto(Activity activity, String SavePath) {

			File file = new File(SavePath, "temp_camera_pic.jpg");
			String parent = file.getParent();
			File pare = new File( parent );
			if (!pare.exists()) {
				pare.mkdirs();
			}
			Intent takePictureFromCameraIntent = new Intent(
					MediaStore.ACTION_IMAGE_CAPTURE);
			takePictureFromCameraIntent.putExtra(
					android.provider.MediaStore.EXTRA_OUTPUT,
					Uri.fromFile(file));
			activity.startActivityForResult(takePictureFromCameraIntent, CODE_TAKE_PICTUARE);

			return file;

			

		}

	

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
		
		
		if( resultCode == RESULT_OK ){
			
			if( requestCode == CODE_PHOTO_ALBUM ){ // 从相册读取  
				/*
				if( data != null){
					Uri selectedImage = data.getData();
					String[] filePathColumns = { MediaStore.Images.Media.DATA };
					Cursor c = this.getContentResolver().query(selectedImage,
							filePathColumns, null, null, null);
					c.moveToFirst();
					int columnIndex = c.getColumnIndex(filePathColumns[0]);
					path = c.getString(columnIndex);
					c.close();
				}
				*/
				
			}
			else if( requestCode == CODE_TAKE_PICTUARE){
				
				path = file.getPath();
				startPhotoZoom(Uri.fromFile(file)); 
			}
			else if( requestCode == CODE_PHOTO_ALBUM_KITKAT){
				Uri selectedImage = data.getData();
				
				// http://blog.csdn.net/tempersitu/article/details/20557383
				path = getPath(activity, selectedImage);
				
				// 剪切图像
				startPhotoZoom(data.getData());
			}
			else if( requestCode == CODE_PHOTO_ALBUM_NEW){  // 调用系统相册 
				// 剪切图像
				startPhotoZoom(data.getData());
				
			}
			else if( requestCode == CODE_PHOTO_NEW_CALE_PIC ){  //得到剪切后的图片
				if (data != null) {
					Bitmap bitmap = getImageToView(data);
					
					ByteArrayOutputStream bStream = new ByteArrayOutputStream();
					bitmap.compress(CompressFormat.PNG, 100, bStream);
					byte[] bytes = bStream.toByteArray();
					bitmap.recycle();
					String str_bitmap = Base64.encodeToString(bytes, Base64.DEFAULT);
					requestNetData_UploadPhoto( str_bitmap );	
					
					try {
						bStream.close();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
			}
			 
			
		}
		
		
		
		
		
	  
		
		System.out.println("image path: "+path);
		
		

		// 上传图片
		if (!path.equals("")) {
			
			requestNetData_UploadPhoto("");	

		}
		
		
	}
	
	
	// 更新头像
	void requestNetData_UploadPhoto( final String str_bitmap ){
		
		
		
	}
	
	
	
	
	

	
	public void OnBack() {
		// TODO Auto-generated method stub
	 
		overridePendingTransition(android.R.anim.fade_in,
				android.R.anim.fade_out);
	}
	
	

	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		super.onBackPressed();
		
		OnBack();
	
		
	}
	
	
	
	
	@SuppressLint("NewApi")
	private static String getPath(final Context context, final Uri uri) {

	    final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

	    // DocumentProvider
	    if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
	        // ExternalStorageProvider
	        if (isExternalStorageDocument(uri)) {
	            final String docId = DocumentsContract.getDocumentId(uri);
	            final String[] split = docId.split(":");
	            final String type = split[0];

	            if ("primary".equalsIgnoreCase(type)) {
	                return Environment.getExternalStorageDirectory() + "/" + split[1];
	            }

	            // TODO handle non-primary volumes
	        }
	        // DownloadsProvider
	        else if (isDownloadsDocument(uri)) {

	            final String id = DocumentsContract.getDocumentId(uri);
	            final Uri contentUri = ContentUris.withAppendedId(
	                    Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

	            return getDataColumn(context, contentUri, null, null);
	        }
	        // MediaProvider
	        else if (isMediaDocument(uri)) {
	            final String docId = DocumentsContract.getDocumentId(uri);
	            final String[] split = docId.split(":");
	            final String type = split[0];

	            Uri contentUri = null;
	            if ("image".equals(type)) {
	                contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
	            } else if ("video".equals(type)) {
	                contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
	            } else if ("audio".equals(type)) {
	                contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
	            }

	            final String selection = "_id=?";
	            final String[] selectionArgs = new String[] {
	                    split[1]
	            };

	            return getDataColumn(context, contentUri, selection, selectionArgs);
	        }
	    }
	    // MediaStore (and general)
	    else if ("content".equalsIgnoreCase(uri.getScheme())) {

	        // Return the remote address
	        if (isGooglePhotosUri(uri))
	            return uri.getLastPathSegment();

	        return getDataColumn(context, uri, null, null);
	    }
	    // File
	    else if ("file".equalsIgnoreCase(uri.getScheme())) {
	        return uri.getPath();
	    }

	    return null;
	}
	
	
	/**
	 * Get the value of the data column for this Uri. This is useful for
	 * MediaStore Uris, and other file-based ContentProviders.
	 *
	 * @param context The context.
	 * @param uri The Uri to query.
	 * @param selection (Optional) Filter used in the query.
	 * @param selectionArgs (Optional) Selection arguments used in the query.
	 * @return The value of the _data column, which is typically a file path.
	 */
	public static String getDataColumn(Context context, Uri uri, String selection,
	        String[] selectionArgs) {

	    Cursor cursor = null;
	    final String column = "_data";
	    final String[] projection = {
	            column
	    };

	    try {
	        cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
	                null);
	        if (cursor != null && cursor.moveToFirst()) {
	            final int index = cursor.getColumnIndexOrThrow(column);
	            return cursor.getString(index);
	        }
	    } finally {
	        if (cursor != null)
	            cursor.close();
	    }
	    return null;
	}


	/**
	 * @param uri The Uri to check.
	 * @return Whether the Uri authority is ExternalStorageProvider.
	 */
	public static boolean isExternalStorageDocument(Uri uri) {
	    return "com.android.externalstorage.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri The Uri to check.
	 * @return Whether the Uri authority is DownloadsProvider.
	 */
	public static boolean isDownloadsDocument(Uri uri) {
	    return "com.android.providers.downloads.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri The Uri to check.
	 * @return Whether the Uri authority is MediaProvider.
	 */
	public static boolean isMediaDocument(Uri uri) {
	    return "com.android.providers.media.documents".equals(uri.getAuthority());
	}

	/**
	 * @param uri The Uri to check.
	 * @return Whether the Uri authority is Google Photos.
	 */
	public static boolean isGooglePhotosUri(Uri uri) {
	    return "com.google.android.apps.photos.content".equals(uri.getAuthority());
	}
	
	
////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * 裁剪图片方法实现
	 * 
	 * @param uri
	 */
	public void startPhotoZoom(Uri uri) {

		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		// 设置裁剪
		intent.putExtra("crop", "true");
		// aspectX aspectY 是宽高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪图片宽高
		intent.putExtra("outputX", 320);
		intent.putExtra("outputY", 320);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, CODE_PHOTO_NEW_CALE_PIC);
	}

	/**
	 * 保存裁剪之后的图片数据
	 * 
	 * @param picdata
	 */
	private Bitmap getImageToView(Intent data) {	
		Bundle extras = data.getExtras();	
		if (extras != null) {
			//System.out.println("===bundle===: "+extras.toString() ); 
	//		Uri selectedImage = data.getData();
	//		System.out.println("uri: "+selectedImage);
			
			Bitmap photo = extras.getParcelable("data");
	//		Drawable drawable = new BitmapDrawable(photo);
	//		faceImage.setImageDrawable(drawable);
			return photo;
		}
		
		return null;
	}
	
	
	
}











